package sc.helper;

public class Helper {

	/**
	 * 
	 * Convert a byte[] array to readable string format. This makes the "hex"
	 * readable!
	 * 
	 * @return result String buffer in String format
	 * 
	 * @param in
	 *            byte[] buffer to convert to string format
	 * 
	 */

	public static String byteArrayToHexString(byte in[]) {

	    byte ch = 0x00;
	    int i = 0; 
	    if (in == null || in.length <= 0) {
	        return null;
	    }
	        
	    String pseudo[] = {"0", "1", "2",
	    				"3", "4", "5", "6", "7", "8",
	    				"9", "A", "B", "C", "D", "E",
	    				"F"};

	    StringBuffer out = new StringBuffer(in.length * 2);

	    while (i < in.length) {
	        ch = (byte) (in[i] & 0xF0); // Strip off high nibble
	        ch = (byte) (ch >>> 4);		// shift the bits down
	        ch = (byte) (ch & 0x0F);    // must do this is high order bit is on!
	        out.append(pseudo[ (int) ch]); // convert the nibble to a String Character
	        ch = (byte) (in[i] & 0x0F); // Strip off low nibble 
	        out.append(pseudo[ (int) ch]); // convert the nibble to a String Character
	        i++;
	    }

	    String rslt = new String(out);
	    return rslt;
	}

	public static byte[] hexStringToByteArray( String hexStr ){
	    byte bArray[] = new byte[hexStr.length()/2];  
	    for(int i=0; i<(hexStr.length()/2); i++){
	    	byte firstNibble  = Byte.parseByte(hexStr.substring(2*i,2*i+1),16); // [x,y)
	    	byte secondNibble = Byte.parseByte(hexStr.substring(2*i+1,2*i+2),16);
	    	int finalByte = (secondNibble) | (firstNibble << 4 ); // bit-operations only with numbers, not bytes.
	    	bArray[i] = (byte) finalByte;
	    }
	    return bArray;
	}
}
